package models

import (
	"WchimeGinSystem/conf"
	"fmt"
	"os"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
)

var DB *gorm.DB

func InitDatabase() {
	DB = ConnDatabase()
	// 迁移数据表，在没有数据表结构变更时候，建议注释不执行
	// 注意:初次运行后可注销此行
	migrateDB()

}

func ConnDatabase() *gorm.DB {
	fmt.Println("开始连接数据库...")

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", conf.MYSQL_USER, conf.MYSQL_PWD, conf.MYSQL_HOST, conf.MYSQL_PORT, conf.MYSQL_DATABASE)

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		// gorm日志模式：silent
		Logger: logger.Default.LogMode(logger.Silent),

		// 外键约束
		DisableForeignKeyConstraintWhenMigrating: true,

		NamingStrategy: schema.NamingStrategy{
			// 使用单数表名，启用该选项，此时，`User` 的表名应该是 `user`
			SingularTable: true,
		},
	})
	if err != nil {
		fmt.Println("连接数据库失败，请检查参数：", err)
		os.Exit(1)
	}

	sqlDB, _ := db.DB()
	// SetMaxIdleCons 设置连接池中的最大闲置连接数。
	sqlDB.SetMaxIdleConns(10)

	// SetMaxOpenCons 设置数据库的最大连接数量。
	sqlDB.SetMaxOpenConns(100)

	// SetConnMaxLifetiment 设置连接的最大可复用时间。
	sqlDB.SetConnMaxLifetime(10 * time.Second)
	return db

}

func migrateDB() {

	fmt.Println("迁移数据库...")
	_ = DB.AutoMigrate(User{}, Log{})

}
